/**
 * @fileOverview 搜索页面业务控件
 * @ignore
 */

define('common/search',
    ['bui/common', 'bui/grid', 'bui/form', 'bui/data', 'bui/overlay'],
    function (require) {
      var BUI = require('bui/common'),
          Grid = require('bui/grid'),
          Data = require('bui/data'),
          Overlay = require('bui/overlay'),
          Form = require('bui/form');

      /**
       * @class Search
       * 搜索页类
       */
      function Search(config) {

        Search.superclass.constructor.call(this, config);
        this._init();
      }

      Search.ATTRS = {
        /**
         * 是否自动查询，打开页面时未点击查询按钮时是否自动查询
         * @type {Boolean}
         */
        autoSearch: {
          value: true
        },
        /**
         * grid 容器的 id
         * @type {String}
         */
        gridId: {
          value: 'grid'
        },
        /**
         * 表单的容器的id
         * @type {String}
         */
        formId: {
          value: 'searchForm'
        },
        /**
         * 查询按钮的id
         * @type {Object}
         */
        btnId: {
          value: 'btnSearch'
        },
        /**
         * 表单的配置项
         * @type {Object}
         */
        formCfg: {
          value: {}
        },
        /**
         * grid 表格的配置项
         * @type {Object}
         */
        gridCfg: {},
        /**
         * 表单对象
         * @type {Object}
         */
        form: {},
        /**
         * 表格对象
         * @type {Object}
         */
        grid: {},
        /**
         * 数据缓冲类
         * @type {Object}
         */
        store: {}
      }

      BUI.extend(Search, BUI.Base);

      BUI.augment(Search, {
        _init: function () {
          var _self = this;

          _self._initForm();
          _self._initStoreEvent();
          _self._initGrid();
          _self._initEvent();
          _self._initData();
        },
        //初始化事件
        _initEvent: function () {
          this._initDomEvent();
          this._initFormEvent();
          this._initGridEvent();
        },
        _initDomEvent: function () {
          var _self = this,
              btnId = _self.get('btnId'),
              store = _self.get('store'),
              form = _self.get('form');
          $('#' + btnId).on('click', function (ev) {
            ev.preventDefault();
            form.valid();
            if (form.isValid()) {
              _self.load(true);
            }
          });
        },
        //初始化form
        _initForm: function () {
          var _self = this,
              form = _self.get('form');
          if (!form) {
            var formCfg = BUI.merge(_self.get('formCfg'), {
              srcNode: '#' + _self.get('formId')
            });
            form = new Form.HForm(formCfg);
            form.render();
            _self.set('form', form);
          }
        },
        _initFormEvent: function () {

        },
        //初始化表格
        _initGrid: function () {
          var _self = this,
              grid = _self.get('grid');
          if (!grid) {
            var gridCfg = _self.get('gridCfg'),
                store = _self.get('store');
            gridCfg.store = store;
            gridCfg.render = '#' + _self.get('gridId'),
                grid = new Grid.Grid(gridCfg);
            grid.render();
            _self.set('grid', grid);
          }
        },
        _initGridEvent: function () {

        },
        _initData: function () {
          var _self = this,
              autoSearch = _self.get('autoSearch');
          if (autoSearch) {
            _self.load(true);
          }
        },
        //初始化数据加载事件
        _initStoreEvent: function () {
          var _self = this,
              store = _self.get('store');
          //处理异常
          store.on('exception', function (ev) {
            BUI.Message.Alert(ev.error);
          });
        },
        /**
         * 加载数据
         * @param {Boolean} reset 是否重置表格查询的页数
         */
        load: function (reset) {
          var _self = this,
              form = _self.get('form'),
              store = _self.get('store'),
              param = form.serializeToObject();
          if (reset) {
            param.start = 0;
            param.pageIndex = 0;
          }
          store.load(param);
        }
      });

      Search.createStore = function (url, cfg) {

        cfg = BUI.merge({
          autoLoad: false,
          url: url,
          pageSize: 30
        }, cfg);
        return new Data.Store(cfg);
      };

      Search.createGridCfg = function (columns, cfg) {
        cfg = BUI.merge({
          columns: columns,
          loadMask: true,
          bbar: {
            pagingBar: true
          }
        }, cfg);

        return cfg;
      };

      Search.createLink = function (cfg) {
        var temp = '<span class="page-action grid-command" data-id="{id}" data-href="{href}" title="{title}">{text}</span>';
        return BUI.substitute(temp, cfg);
      }
      return Search;
    });